package com.knight.arch.module; import android.content.Context; import android.net.Uri; import com.google.gson.Gson; import com.knight.arch.BuildConfig; import com.knight.arch.R; import com.knight.arch.api.ApiService; import com.knight.arch.api.FirService; import com.knight.arch.api.OAuthGitHubWebFlow; import com.knight.arch.api.ReposTrendingApiService; import com.knight.arch.utils.L; import com.squareup.okhttp.Cache; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.internal.DiskLruCache; import com.squareup.picasso.OkHttpDownloader; import com.squareup.picasso.Picasso; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import javax.inject.Named; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import retrofit.ErrorHandler; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.OkClient; import retrofit.converter.GsonConverter; /** * @author andyiac * @date 15-8-4 * @web http://blog.andyiac.com/ */ @Module( library = true, complete = false ) public class DataModule { @Provides @Singleton Gson provideGson() { return new Gson(); } @Provides @Singleton Picasso providePicasso(OkHttpClient okHttpClient, Context ctx) { Picasso.Builder builder = new Picasso.Builder(ctx); builder.downloader(new OkHttpDownloader(okHttpClient)) .listener(new Picasso.Listener() { public void onImageLoadFailed(Picasso picasso, Uri uri, Exception exception) { L.e(exception + "Picasso load image failed: " + uri.toString()); } }) .indicatorsEnabled(false) .loggingEnabled(false); return builder.build(); } @Provides @Singleton OkHttpClient provideOkHttp(Cache cache) { OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setCache(cache); okHttpClient.setConnectTimeout(30, TimeUnit.SECONDS); return okHttpClient; } @Provides @Singleton Cache provideHttpCache(@Named("Http") File httpCacheDir) { //100M; int cacheSize = 1024 * 1024 * 100; try { return new Cache(httpCacheDir, cacheSize); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { L.e("install http cache false"); } return null; } @Provides @Singleton DiskLruCache provideDataCache(@Named("Data") File cacheDir) { DiskLruCache cache = null; try { //10M cache = DiskLruCache.open(cacheDir, BuildConfig.VERSION_CODE, 1, 1024 * 1024 * 10); } catch (IOException e) { e.printStackTrace(); L.e(e + "install data cache failed"); } return cache; } @Provides @Singleton RestAdapter provideRestAdapter(Gson gson, OkHttpClient okHttpClient, ErrorHandler errorHandler) { return new RestAdapter.Builder() .setErrorHandler(errorHandler) .setClient(new OkClient(okHttpClient)) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.BASIC) // .setEndpoint("http://mock-api.com/TyTabSFqXNyqMpNw.mock") .setEndpoint("https://api.github.com") .build(); } @Provides @Singleton FirService provideFirService(Gson gson, OkHttpClient okHttpClient, ErrorHandler errorHandler) { RestAdapter restAdapter = new RestAdapter.Builder() .setErrorHandler(errorHandler) .setClient(new OkClient(okHttpClient)) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.BASIC) .setEndpoint("http://api.fir.im") .build(); return restAdapter.create(FirService.class); } @Provides @Singleton ReposTrendingApiService provideTrendingApiService(Gson gson, OkHttpClient okHttpClient, ErrorHandler errorHandler) { RestAdapter restAdapter = new RestAdapter.Builder() .setErrorHandler(errorHandler) .setClient(new OkClient(okHttpClient)) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.BASIC) .setEndpoint("http://trending.codehub-app.com") .build(); return restAdapter.create(ReposTrendingApiService.class); } @Provides @Singleton OAuthGitHubWebFlow provideOAuthGitHubWebFlow(Gson gson, OkHttpClient okHttpClient, ErrorHandler errorHandler) { RestAdapter restAdapter = new RestAdapter.Builder() .setErrorHandler(errorHandler) .setClient(new OkClient(okHttpClient)) .setConverter(new GsonConverter(gson)) .setLogLevel(RestAdapter.LogLevel.BASIC) .setEndpoint("https://github.com") .build(); return restAdapter.create(OAuthGitHubWebFlow.class); } @Provides @Singleton ErrorHandler provideErrorHandler(final Context ctx) { return new ErrorHandler() { @Override public Throwable handleError(RetrofitError retrofitError) { L.e(retrofitError + "请求出现错误:%s" + retrofitError.getUrl()); RetrofitError.Kind kind = retrofitError.getKind(); String message; if (RetrofitError.Kind.NETWORK.equals(kind)) { message = ctx.getString(R.string.network_error); } else if (RetrofitError.Kind.HTTP.equals(kind)) { message = ctx.getString(R.string.http_error); } else if (RetrofitError.Kind.CONVERSION.equals(kind)) { message = ctx.getString(R.string.conversion_error); } else { message = ctx.getString(R.string.unexpected_error); } return new Exception(message); } }; } @Provides @Singleton ApiService provideApiService(RestAdapter restAdapter) { return restAdapter.create(ApiService.class); } }